// public private 和 protected§
// TypeScript 可以使用三种访问修饰符（Access Modifiers），分别是 public、private 和 protected。

// public 修饰的属性或方法是公有的，可以在任何地方被访问到，默认所有的属性和方法都是 public 的
// private 修饰的属性或方法是私有的，只能在类中访问 在子类中不能访问 只能继承在类中不能访问
// protected 修饰的属性或方法是受保护的，它和 private 类似，区别是它在子类中也是允许被访问的

class B {
    // readonly 不能对静态成员使用
    private static readonly id: number; //不能被外部访问
    readonly price: string;
    protected count: number;
    private setting: string;

    constructor(id: number, setting: string, price: string, count: number) {
        this.price = price;
        this.setting = setting;
        // (B.id = id), //报错
        this.count = count
    }

    sayhi() {
        // this.price = 741165; //只读属性
        // console.log(this.id);//报错 this 实例不存在id
        console.log(`ID:${B.id}  ${this.setting}${this.count} `); //只能在类中访问
    }
}

const b = new B(2122, "dfas", "1w", 20);
// console.log(B.id);//被 private static 修饰只能通过B.id在实例化内部访问
console.log(b.price);
b.sayhi();

// console.log(b.setting);

class C extends B {
    constructor(id: number, setting: string, price: string, count: number) {
        super(id, setting, price, count);
    }

    sayhello() {
        // console.log(this.id, this.setting, this.price); //报错 id，setting不能访问
        console.log(this.count); //不报错 projected它在子类中也是允许被访问的
    }
}

namespace fsdf {
    type foreach<T> = (value: T, index: number, arr: T[]) => void;
    const s: foreach<number> = (value) => {
        console.log(value);
    };
}
